
// static void _ReadObj_one(Mesh* m,char const * filename)
// {
// #ifdef _WIN32
//     FILE *infile;
//     fopen_s(&infile,filename,"r");
// #else
//     FILE *infile=fopen(filename,"r");
// #endif
//     if(!infile)
//     {
//         printf("can't open this file %s\n",filename);
//     }
//     fseek(infile,0,SEEK_SET);
//     int mark=0;
//     char str[400]={NULL},str1[300]={NULL};

//     Node* tree1=NULL,*tree2=NULL,*tree3=NULL;

//     int id=-1,id1=-1,id2=-1;
//     template_v* v=NULL;

//     char mtlname[100]={NULL},group_info[300]={NULL},group_info1[300]={NULL};
//     OBJ_MESH_PROP*omp=(OBJ_MESH_PROP*)malloc(sizeof(OBJ_MESH_PROP));
//     obj_mesh_prop_init(omp);    
//     Node* polygons=NULL;polygons=node_overlying(polygons,NULL);

//     while(!feof(infile))
//     {
//         fgets(str,400,infile);
//         //printf("%s",str);
//         if(feof(infile))
//         {
//             break;
//         }
//         if(str[0]=='#')
//         {
//             continue;
//         }
//         else if(str[0]=='v'&&str[1]=='t'&&str[2]==' ')
//         {
//             double *point=(double*)malloc(sizeof(double)*2);
//             tree1=node_overlying(tree1,point);
//             sscanf(&str[3],"%lf %lf ",&(point[0]),&(point[1])); 
//         }
//         else if(str[0]=='v'&&str[1]=='n'&&str[2]==' ')
//         {
//             double *point=(double*)malloc(sizeof(double)*3);
//             tree2=node_overlying(tree2,point);
//             sscanf(&str[3],"%lf %lf %lf",&(point[0]),&(point[1]),&(point[2]));
 
//         }
//         else if(str[0]=='v'&&str[1]==' ')
//         {
//             double *point=(double*)malloc(sizeof(double)*3);
//             sscanf(&str[2],"%lf %lf %lf",&(point[0]),&(point[1]),&(point[2]));
//             tree3=node_overlying(tree3,point); 
//         }
//         else if(str[0]=='f'&&str[1]==' ')
//         { 
//             if(strcmp(group_info,group_info1)!=0)
//             {
//                 polygons=node_overlying(polygons,NULL); 
//                 strcpy(group_info1,group_info); 
//             }
//             Node* sub_polygons=(Node*)(polygons->value);

//             int fv_rows=0;
//             memset(str1,0,sizeof(char)*300);
//             char**words=split(&str[2],' ',&fv_rows); 
//             fv_rows>mark?mark=fv_rows:mark=mark;
            
//             TEMP_OBJ_CELL_INFO* toci=(TEMP_OBJ_CELL_INFO*)malloc(sizeof(TEMP_OBJ_CELL_INFO));
//             toci->len=fv_rows;
            
//             toci->vids=(int**)malloc(sizeof(int*)*toci->len);
//             toci->ocp=(OBJ_CELL_PROP*)malloc(sizeof(OBJ_CELL_PROP));
//             obj_cell_prop_init(toci->ocp);toci->ocp->n=toci->len;
//             if(strlen(mtlname)>0)
//             {
//                 toci->ocp->mtlname=(char*)malloc(sizeof(char)*(strlen(mtlname)+1)); 
//                 strcpy( toci->ocp->mtlname,mtlname);
//             }
//             if(strlen(group_info)>0)
//             {
//                 toci->ocp->group_info=(char*)malloc(sizeof(char)*(strlen(group_info)+1));
//                 strcpy(toci->ocp->group_info,group_info);
//             } 
//             for(int i=0;i<toci->len;i++)
//             {
//                 id=-1;id1=-1;id2=-1;
//                 my_sscanf(words[i],&id,&id1,&id2);
//                 if(id<0)
//                 {
//                     printf("cuow************************\n");
//                     if(words[i][strlen(words[i])-1]=='\n')
//                     {
//                         printf("zhengshi %d\n",strlen(words[i]));
//                     } 
//                     printf("cuwu %d %d %s\n",i,strlen(str),words[i]);
//                     printf("%s\n",str);
//                     return;
//                 }
//                 id--;id1--;id2--;
//                 // printf("%d %d %d\n",id,id1,id2);
//                 toci->vids[i]=(int*)malloc(sizeof(int)*3);
//                 toci->vids[i][0]=id;toci->vids[i][1]=id1;toci->vids[i][2]=id2;
//                 free(words[i]);
//             }
//             SAFE_FREE(words);
//             sub_polygons=node_overlying(sub_polygons,toci);
//             polygons->value=sub_polygons;
//         }
//         else if (str[0]=='u'&&str[1]=='s'&&str[2]=='e'&&str[3]=='m'&&str[4]=='t'&&str[5]=='l'&&str[6]==' ')
//         {
//             sscanf(&str[7],"%s",mtlname);
//         }
//         else if (str[0]=='m'&&str[1]=='t'&&str[2]=='l'&&str[3]=='l'&&str[4]=='i'&&str[5]=='b'&&str[6]==' ')
//         {
//             omp->mtlibname=(char*)malloc(sizeof(char)*(strlen(str)-6));
//             memset(omp->mtlibname,0,sizeof(char)*(strlen(str)-6));
//             sscanf(&str[7],"%s",omp->mtlibname);
//         }
//         else if (str[0]=='g'&&str[1]==' ')
//         {
//             sscanf(&str[2],"%s",group_info);
//         }
//     }
//     double** tree1_a=get_double_array_from_node(tree1);
//     double** tree2_a=get_double_array_from_node(tree2);
//     double** tree3_a=get_double_array_from_node(tree3);

//     printf("size polygons:%d\n",node_size(polygons));
//     for(Node* nit=node_reverse(polygons);nit!=NULL;nit=(Node*)(nit->Prev))
//     {
//         Node* sub_polygons=(Node*)(nit->value);
//         Int_RB_Tree* temp_tree=(Int_RB_Tree*)malloc(sizeof(Int_RB_Tree));
//         int_rb_tree_init(temp_tree); 
//         for(Node* nit1=node_reverse(sub_polygons);nit1!=NULL;nit1=(Node*)(nit1->Prev))
//         {
//             TEMP_OBJ_CELL_INFO*toci=(TEMP_OBJ_CELL_INFO*)(nit1->value);
//             template_v** temp_v=(template_v**)malloc(sizeof(template_v*)*toci->len);
            
//             toci->ocp->vt=(double**)malloc(sizeof(double*)*toci->len);memset(toci->ocp->vt,0,sizeof(double*)*toci->len);
//             toci->ocp->vn=(double**)malloc(sizeof(double*)*toci->len);memset(toci->ocp->vn,0,sizeof(double*)*toci->len);
            
//             for(int i=0;i<toci->len;i++)
//             {
//                 template_v* v=(template_v*)(temp_tree->find(temp_tree,toci->vids[i][0]));
//                 if(v==NULL)
//                 {
//                     double* p1=tree3_a[toci->vids[i][0]];
//                     if(p1==NULL)
//                     {
//                         printf("cuowuuu1 %d\n",toci->vids[i][0]);
//                         return ; 
//                     }
//                     v=m->create_vertexv(m,p1,3); 
//                     if(v!=NULL)
//                     {
//                         temp_tree->insert(temp_tree,toci->vids[i][0],v);
//                     }
//                     else
//                     {
//                         printf("cuowu v is NULL\n");
//                         return ;
//                     }
//                 } 
//                 temp_v[i]=v;
//                 if(toci->vids[i][1]>=0)
//                 {
//                     double* p=tree1_a[toci->vids[i][1]];
//                     toci->ocp->vt[i]=(double*)malloc(sizeof(double)*2);
//                     toci->ocp->vt[i][0]=p[0];toci->ocp->vt[i][1]=p[1];
//                 } 
//                 if(toci->vids[i][2]>=0)
//                 {
//                     double*p=tree2_a[toci->vids[i][2]]; 
//                     toci->ocp->vn[i]=(double*)malloc(sizeof(double)*3);
//                     toci->ocp->vn[i][0]=p[0];toci->ocp->vn[i][1]=p[1];toci->ocp->vn[i][2]=p[2];
//                 } 
//                 free(toci->vids[i]);
//             } 
//             template_hf**temp_hf=(template_hf**)malloc(sizeof(template_hf*)*toci->len);
//             int flag=0;
//             for(int i=0;i<toci->len;i++)
//             {
//                 template_v*vs[2]={temp_v[i],temp_v[(i+1)%toci->len]};
//                 template_f*f=m->create_facev(m,vs,2); 
//                 temp_hf[i]=m->create_halfface(m,f,vs,2);
//                 if(temp_hf[i]==NULL)
//                 {
//                     flag=1;
                    
//                     break;
//                 }
//             }
//             if(flag==1)
//             {
//                 for(int i=0;i<toci->len;i++)
//                 {
//                     template_v* v=m->create_vertexv(m,temp_v[i]->point,3);
//                     temp_v[i]=v;
//                 }
//                 for(int i=0;i<toci->len;i++)
//                 {
//                     template_v*vs[2]={temp_v[i],temp_v[(i+1)%toci->len]};
//                     template_f*f=m->create_facev(m,vs,2); 
//                     temp_hf[i]=m->create_halfface(m,f,vs,2);
//                 }
//             }
//             template_c*c=m->create_cellf(m,temp_hf,toci->len);
//             c->prop=toci->ocp;
//             free(temp_v);free(temp_hf); 
//             free(toci->vids);
//             free(toci);
//         }
//         int_rb_tree_free(temp_tree);
//         free_node(sub_polygons);
//     }

//     free_node(polygons);
//     free(tree1_a);free(tree2_a);free(tree3_a);

//     free_node_value(tree1);free_node_value(tree2);free_node_value(tree3);
//     free_node(tree1);free_node(tree2);free_node(tree3);
//     if(omp->mtlibname!=NULL&&strlen(omp->mtlibname)>0)
//     {
//         (m->prop=omp);
//     }
//     else
//     {
//         obj_mesh_prop_free(omp);
//     }
 
//     fclose(infile);
//     if(mark==3)
//     {
//         m->simplex=1;
//         m->dimension=2;
//     }
//     else if(mark==0)
//     {
//         m->dimension=0;
//         m->simplex=1;
//     }
//     else
//     {
//         m->dimension=2;
//         m->simplex=0;
//     }
// }
